using System;
using EPiServer.Core;
using EPiServer.SpecializedProperties;
using PageTypeBuilder;
using TemplateFoundation.Tags;

namespace TemplateFoundation.PageTypes
{
    /// <summary>
    /// Represents the most basic page type used in ETF
    /// </summary>
    /// <seealso cref="PageTypeBase"/>
    public interface IPageType
    {
        #region ETF Properties
        
        /// <summary>
        /// <see cref="PageTypeBase.Tags"/>
        /// </summary>
        TagCollection Tags { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.Title"/>
        /// </summary>
        string Title { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.Description"/>
        /// </summary>
        string Description { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.Keywords"/>
        /// </summary>
        string Keywords { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.Author"/>
        /// </summary>
        string Author { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.Copyright"/>
        /// </summary>
        string Copyright { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.EnableIndexing"/>
        /// </summary>
        bool EnableIndexing { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.EnableLinkFollowing"/>
        /// </summary>
        bool EnableLinkFollowing { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.RelatedLinks"/>
        /// </summary>
        LinkItemCollection RelatedLinks { get; set; }

        /// <summary>
        /// <see cref="PageTypeBase.PageContact"/>
        /// </summary>
        PageReference PageContact { get; set; }

        #endregion

        #region EPiServer PageData members

        /// <summary>
        /// <see cref="PageData.PageName"/>
        /// </summary>
        string PageName { get; set; }

        /// <summary>
        /// <see cref="PageData.LanguageBranch"/>
        /// </summary>
        string LanguageBranch { get; }

        /// <summary>
        /// <see cref="PageData.LinkURL"/>
        /// </summary>
        string LinkURL { get; }

        /// <summary>
        /// <see cref="PageData.PageTypeName"/>
        /// </summary>
        string PageTypeName { get; set; }

        /// <summary>
        /// <see cref="PageData.URLSegment"/>
        /// </summary>
        string URLSegment { get; set; }

        /// <summary>
        /// Gets the page link.
        /// </summary>
        PageReference PageLink { get; }
        
        /// <summary>
        /// Gets the parent link.
        /// </summary>
        PageReference ParentLink { get; set; }

        /// <summary>
        /// Gets the created.
        /// </summary>
        DateTime Created { get; }

        /// <summary>
        /// Gets the start publish date
        /// </summary>
        DateTime StartPublish { get; set; }

        /// <summary>
        /// Gets the status.
        /// </summary>
        VersionStatus Status { get; }
       
        /// <summary>
        /// Gets or sets the <see cref="System.Object"/> at the specified index.
        /// </summary>
        object this[string index] { get; set; }
        #endregion
    }
}